/*
*	Ivan Concua 12352
*	Roberto Andrino 12413
*	Algoritmos y estructuras de datos
*	DoublyLinkedList.java
*	Implementacion de List. DoublyLinkedList es una lista
*	doblemente encadenada. Es parte del ADT de List
*/

public class DoublyLinkedList<E> extends AbstractList<E>
{
	protected int count;
	protected DoublyLinkedNode<E> head;
	protected DoublyLinkedNode<E> tail;

	public DoublyLinkedList()
	// post: constructs an empty list
	{
	   head = null;
	   tail = null;
	   count = 0;
	}

	public void push(E value)
	// pre: value is not null
	// post: adds new value to tail of list
	{
	   // construct new element
	   tail = new DoublyLinkedNode<E>(value, null, tail);
	   // fix up head
	   if (head == null) 
			head = tail;
			
		count++;
	}

	public E pop()
	// pre: list is not empty
	// post: removes value from tail of list
	{
	   DoublyLinkedNode<E> temp = tail;
	   tail = tail.previous();
	   
	   if (tail == null)
		   head = null;
		   
	   else
		   tail.setNext(null);
		   
	   count--;
	   return temp.value();
	}
	
	public E peek()
	// pre: La lista no esta vacia
    // post: Se regresa el ultimo item en haber sido pushed a la lista
	{
		DoublyLinkedNode<E> temp = tail;
		return temp.value();
	}
	
	public int size()
	// pre:
    // post: regresa la cantidad de elementos en la lista
	{
		return count;
	}
}
